#ifndef __DRV_VBUS_SW_H
#define __DRV_VBUS_SW_H

#include "at32f421_board.h"

extern uint8_t usb_ovcstat[4];

#define USB_SY6288C 1 // High level on
//#define USB_SY6288D 1 // Low level on

#if USB_SY6288C

#define VBUS1_OFF()  gpio_bits_reset(GPIOA, GPIO_PINS_2)
#define VBUS1_ON() gpio_bits_set(GPIOA, GPIO_PINS_2)

#define VBUS2_OFF()  gpio_bits_reset(GPIOA, GPIO_PINS_7)
#define VBUS2_ON() gpio_bits_set(GPIOA, GPIO_PINS_7)

#define VBUS3_OFF()  gpio_bits_reset(GPIOA, GPIO_PINS_8)
#define VBUS3_ON() gpio_bits_set(GPIOA, GPIO_PINS_8)

#define VBUS4_OFF()  gpio_bits_reset(GPIOA, GPIO_PINS_9)
#define VBUS4_ON() gpio_bits_set(GPIOA, GPIO_PINS_9)

#define VBUS1_STATRD() gpio_output_data_bit_read(GPIOA, GPIO_PINS_2)
#define VBUS2_STATRD() gpio_output_data_bit_read(GPIOA, GPIO_PINS_7)
#define VBUS3_STATRD() gpio_output_data_bit_read(GPIOA, GPIO_PINS_8)
#define VBUS4_STATRD() gpio_output_data_bit_read(GPIOA, GPIO_PINS_9)

#elif USB_SY6288D

#define VBUS1_OFF()  gpio_bits_set(GPIOA, GPIO_PINS_2)
#define VBUS1_ON() gpio_bits_reset(GPIOA, GPIO_PINS_2)

#define VBUS2_OFF()  gpio_bits_set(GPIOA, GPIO_PINS_7)
#define VBUS2_ON() gpio_bits_reset(GPIOA, GPIO_PINS_7)

#define VBUS3_OFF()  gpio_bits_set(GPIOA, GPIO_PINS_8)
#define VBUS3_ON() gpio_bits_reset(GPIOA, GPIO_PINS_8)

#define VBUS4_OFF()  gpio_bits_set(GPIOA, GPIO_PINS_9)
#define VBUS4_ON() gpio_bits_reset(GPIOA, GPIO_PINS_9)

#define VBUS1_STATRD() !gpio_output_data_bit_read(GPIOA, GPIO_PINS_2)
#define VBUS2_STATRD() !gpio_output_data_bit_read(GPIOA, GPIO_PINS_7)
#define VBUS3_STATRD() !gpio_output_data_bit_read(GPIOB, GPIO_PINS_8)
#define VBUS4_STATRD() !gpio_output_data_bit_read(GPIOB, GPIO_PINS_9)

#endif

#define VBUS1_OVCRD() !gpio_input_data_bit_read(GPIOA, GPIO_PINS_3)
#define VBUS2_OVCRD() !gpio_input_data_bit_read(GPIOA, GPIO_PINS_6)
#define VBUS3_OVCRD() !gpio_input_data_bit_read(GPIOB, GPIO_PINS_1)
#define VBUS4_OVCRD() !gpio_input_data_bit_read(GPIOB, GPIO_PINS_7)

void vbus_sw_gpio_init(void);
void vbus_ovc_scan(void);

#endif // __DRV_VBUS_SW_H
